package com.example;

import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import static com.example.CaptureProperty.isSelected;

/**
 * <p>网格布局管理</p>
 *
 * @author dc
 * @date 2025-09-18
 **/
public class PaneManager {
    private static PaneManager instance;

    private final Stage primaryStage;
    private final Stage captureStage;
    private final MaskManager maskManager;
    private final DrawStackManager drawStackManager;
    private final ToolbarManager toolbarManager;
    private final AnchorPane rootPane;

    /**
     * 窗体管理器实例化，构造窗口基本结构
     * <pre>
     * captureStage: scene: rootPane（根布局，背景图）---->selectionRect（选择空洞）
     *                       /        \
     *                      /          \
     *           toolbar（工具栏）       maskPane（遮罩）
     * </pre>
     */
    public PaneManager(Stage primaryStage) {
        this.primaryStage = primaryStage;
        captureStage = new Stage();
        // 创建父布局，锚点定位，类似于css中的绝对定位，子节点通过AnchorPane.setLeftAnchor等函数来设置自身位置
        rootPane = new AnchorPane();
        maskManager = new MaskManager(this);
        drawStackManager = new DrawStackManager(this);
        toolbarManager = new ToolbarManager(this);
        // 先添加遮罩再添加选择区域，否则选择区域会遮挡布局遮挡（元素添加顺序决定了显示层级，后添加的显示层级更高）
        rootPane.getChildren().addAll(maskManager.getMaskPane(), maskManager.getSelectionRect(), drawStackManager.getDrawShapeStack(), maskManager.getCornerGroup(), toolbarManager.getToolbar());
        init();
        instance = this;
    }

    public Stage getCaptureStage() {
        return captureStage;
    }

    public MaskManager getMaskManager() {
        return maskManager;
    }

    public Rectangle getSelectionRect() {
        return maskManager.getSelectionRect();
    }

    public AnchorPane getRootPane() {
        return rootPane;
    }

    public ToolbarManager getToolbarManager() {
        return toolbarManager;
    }
    public DrawStackManager getDrawStackManager() {
        return drawStackManager;
    }

    public static PaneManager getInstance() {
        if (instance == null) {
            System.err.println("PaneManager实例化失败");
        }
        return instance;
    }

    private void init() {
        // 关联窗体布局
        Scene scene = new Scene(rootPane);
        scene.setFill(Color.TRANSPARENT);
        captureStage.setScene(scene);
        captureStage.initOwner(primaryStage);

        // 固定窗口状态，防止发生偏移
        captureStage.setX(0);
        captureStage.setY(0);
        captureStage.setWidth(CaptureProperty.screenWidth);
        captureStage.setHeight(CaptureProperty.screenHeight);

        // 设置全屏时的退出提示词
        captureStage.setFullScreenExitHint("");
        // 用于设置窗口样式为透明，使得窗口背景透明，常用于实现自定义窗口外观或全屏截图选择区域时避免窗口边框干扰。
        captureStage.initStyle(StageStyle.TRANSPARENT);
        // 取消全屏模式，使用手动设置的大小，全屏模式会在失焦的时候隐藏窗口
        // captureStage.setFullScreen(true);
        // 设置窗口始终置顶，但有点bug，偶尔焦点在任务栏上时蒙层会被任务栏遮挡（已通过获取焦点和置前解决）
        captureStage.setAlwaysOnTop(true);
        
        // 窗口关闭请求处理（用户点击关闭按钮或Alt+F4），
        // 如果因为未知原因出现任务图标，则禁止通过任务图标关闭截图窗口，通过任务图标关闭窗口不会更新isCaptureActive，导致后面无法触发截图功能
        captureStage.setOnCloseRequest(event -> {
            System.out.println("收到窗口关闭请求");
            // 可以在这里决定是否允许关闭
            event.consume(); // 取消关闭操作
        });

        // 鼠标事件处理 - 用于选择区域
        final double[] startPoint = new double[2];
        // 鼠标事件处理 - 用于选择区域
        scene.setOnMousePressed(event -> {
            // 选好后不允许重新选择
            if (isSelected) {
                return;
            }
            toolbarManager.clearArea();

            startPoint[0] = event.getX();
            startPoint[1] = event.getY();

            System.out.println("鼠标按下:" + startPoint[0] + "," + startPoint[1]);
            maskManager.updateMaskWithHole(startPoint[0], startPoint[1], 0, 0);
        });

        scene.setOnMouseDragged(event -> {
            // 选好后不允许重新选择
            if (isSelected) {
                return;
            }
            double currentX = event.getX();
            double currentY = event.getY();

            // 计算选择区域的位置和大小
            double x = Math.min(startPoint[0], currentX);
            double y = Math.min(startPoint[1], currentY);
            double width = Math.abs(currentX - startPoint[0]);
            double height = Math.abs(currentY - startPoint[1]);

            // 更新遮罩层，使选择区域透明
            maskManager.updateMaskWithHole(x, y, width, height);
        });

        scene.setOnMouseReleased(event -> {
            // 选好后不允许重新选择
            if (isSelected) {
                return;
            }
            isSelected = true;

            double endX = event.getX();
            double endY = event.getY();
            System.out.println("鼠标释放:" + endX + "," + endY);

            // 获取选择区域的坐标
            Rectangle selectionRect = getSelectionRect();
            double x = selectionRect.getX();
            double y = selectionRect.getY();
            double width = selectionRect.getWidth();
            double height = selectionRect.getHeight();
            // 更新画图布局的位置
            drawStackManager.changeStackPosition(x, y, width, height);

            toolbarManager.showToolbar(x, y, width, height);
        });

        // 添加Esc键取消功能
        // scene监听Esc键有问题，必须要先鼠标点击才能触发，添加全局监听Esc键作为补充
        scene.setOnKeyPressed(event -> {
            if (event.getCode() == javafx.scene.input.KeyCode.ESCAPE) {
                System.out.println("ESC键按下");
                // 关闭整个截图窗口
                toolbarManager.closeCurrentWindow();
            }
        });
    }


    public void addChildToRoot(Pane pane) {
        rootPane.getChildren().add(pane);
    }

    public void removeSelectFromRoot() {
        rootPane.getChildren().remove(maskManager.getSelectionRect());
    }

}
